import { getLocalStorage, setLocalStorage } from "./storage";
import { getDicts } from "/@ts/axios/urlApi/system";


export const itemLabel = (item:any,key?:string) => {
  const  field = key?key:'label'
  return item && item.hasOwnProperty(field)
    ? (item[field] !== '' && item[field] !== null ? item[field] : '--')
    : item !== '' && item !== null
      ? item
      : '--'
}
export const itemValue = (item:any,key?:string) => {
  const  field = key?key:'value'
  return item && item.hasOwnProperty(field)
    ? (item[field] !== '' && item[field] !== null ? item[field] : '')
    : item !== '' && item !== null
      ? item
      : ''
}
 export const handleRowAccordingToProp = (row:any,prop:string)=>{
	if (!prop.includes(".")) return row[prop] ?? "--";
			prop.split(".").forEach(item => (row = row[item] ?? "--"));
			return row;
}
// 回显数据字典
const selectDictLabel = (datas?: any, value?: any) => {
  if (value === undefined) {
    return "";
  }
  var actions = [];
  Object.keys(datas).some((key) => {
    if (datas[key].value == "" + value) {
      actions.push(datas[key].label);
      return true;
    }
  });
  if (actions.length === 0) {
    actions.push(value);
  }
  return actions.join("");
};
// 回显数据字典（字符串、数组）
const selectDictLabels = (datas?: any, value?: any, separator?: any) => {
  if (value === undefined || value.length === 0) {
    return "";
  }
  if (Array.isArray(value)) {
    value = value.join(",");
  }
  var actions: any = [];
  var currentSeparator = undefined === separator ? "," : separator;
  var temp = value.split(currentSeparator);
  Object.keys(value.split(currentSeparator)).some((val) => {
    var match = false;
    Object.keys(datas).some((key) => {
      if (datas[key].value == "" + temp[val]) {
        actions.push(datas[key].label + currentSeparator);
        match = true;
      }
    });
    if (!match) {
      actions.push(temp[val] + currentSeparator);
    }
  });
  return actions.join("").substring(0, actions.join("").length - 1);
};
const formatTool = () => {
  // 日期格式化
  function parseTime(time: any, pattern: string) {
    if (arguments.length === 0 || !time) {
      return null;
    }
    const format = pattern || "{y}-{m}-{d} {h}:{i}:{s}";
    let date;
    if (typeof time === "object") {
      date = time;
    } else {
      if (typeof time === "string" && /^[0-9]+$/.test(time)) {
        time = parseInt(time);
      } else if (typeof time === "string") {
        time = time
          .replace(new RegExp(/-/gm), "/")
          .replace("T", " ")
          .replace(new RegExp(/\.[\d]{3}/gm), "");
      }
      if (typeof time === "number" && time.toString().length === 10) {
        time = time * 1000;
      }
      date = new Date(time);
    }
    const formatObj: any = {
      y: date.getFullYear(),
      m: date.getMonth() + 1,
      d: date.getDate(),
      h: date.getHours(),
      i: date.getMinutes(),
      s: date.getSeconds(),
      a: date.getDay(),
    };
    const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
      let value = formatObj[key];
      // Note: getDay() returns 0 on Sunday
      if (key === "a") {
        return ["日", "一", "二", "三", "四", "五", "六"][value];
      }
      if (result.length > 0 && value < 10) {
        value = "0" + value;
      }
      return value || 0;
    });
    return time_str;
  }

  // 转换字符串，undefined,null等转化为""
  function parseStrEmpty(str?: string) {
    if (!str || str == "undefined" || str == "null") {
      return "";
    }
    return str;
  }

  // 添加日期范围
  function addDateRange(params: any, dateRange: any, propName?: string) {
    let search = params;
    search.params =
      typeof search.params === "object" &&
      search.params !== null &&
      !Array.isArray(search.params)
        ? search.params
        : {};
    dateRange = Array.isArray(dateRange) ? dateRange : [];
    if (typeof propName === "undefined") {
      search.params["beginTime"] = dateRange[0];
      search.params["endTime"] = dateRange[1];
    } else {
      search.params["begin" + propName] = dateRange[0];
      search.params["end" + propName] = dateRange[1];
    }
    return search;
  }
  /**
   * 参数处理
   * @param {*} params  参数
   */
  function tansParams(params: any) {
    let result = "";
    for (const propName of Object.keys(params)) {
      const value = params[propName];
      var part = encodeURIComponent(propName) + "=";
      if (value !== null && value !== "" && typeof value !== "undefined") {
        if (typeof value === "object") {
          for (const key of Object.keys(value)) {
            if (
              value[key] !== null &&
              value[key] !== "" &&
              typeof value[key] !== "undefined"
            ) {
              let params = propName + "[" + key + "]";
              var subPart = encodeURIComponent(params) + "=";
              result += subPart + encodeURIComponent(value[key]) + "&";
            }
          }
        } else {
          result += part + encodeURIComponent(value) + "&";
        }
      }
    }
    return result;
  }

  /**
   * 构造树型结构数据
   * @param {*} data 数据源
   * @param {*} id id字段 默认 'id'
   * @param {*} parentId 父节点字段 默认 'parentId'
   * @param {*} children 孩子节点字段 默认 'children'
   */
  function handleTree(data: any, id?: any, parentId?: any, children?: any) {
    let config = {
      id: id || "id",
      parentId: parentId || "parentId",
      childrenList: children || "children",
    };

    var childrenListMap: any = {};
    var nodeIds: any = {};
    var tree: any = [];

    for (let d of data) {
      let parentId = d[config.parentId];
      if (childrenListMap[parentId] == null) {
        childrenListMap[parentId] = [];
      }
      nodeIds[d[config.id]] = d;
      childrenListMap[parentId].push(d);
    }

    for (let d of data) {
      let parentId = d[config.parentId];
      if (nodeIds[parentId] == null) {
        tree.push(d);
      }
    }

    for (let t of tree) {
      adaptToChildrenList(t);
    }

    function adaptToChildrenList(o) {
      if (childrenListMap[o[config.id]] !== null) {
        o[config.childrenList] = childrenListMap[o[config.id]];
      }
      if (o[config.childrenList]) {
        for (let c of o[config.childrenList]) {
          adaptToChildrenList(c);
        }
      }
    }
    return tree;
  }

  // 获取字典
  async function getDict(key: string) {
    let options: any = [];
    let data = getLocalStorage("dictData")
      ? getLocalStorage("dictData")
      : {};
    let dict = data[key];
    if (dict != null) {
      options = dict;
      return options;
    }
    let response: any = await getDicts(key);
    options = response.data.map((res: any) => {
      return {
        value: res.dictValue,
        label: res.dictLabel,
        type: res.listClass,
      };
    });
    data[key] = options;
    setLocalStorage("dictData",data);
    return options;
  }

  return {
    parseTime,
    parseStrEmpty,
    addDateRange,
    tansParams,
    handleTree,
    getDict,
    selectDictLabel,
    
  };
};
export default formatTool;
